﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Xml;
using System.Xml.Linq;



using Microsoft.Office.Tools.Excel;
using Microsoft.VisualStudio.Tools.Applications.Runtime;
using Excel = Microsoft.Office.Interop.Excel;
using Office = Microsoft.Office.Core;
using System.Text.RegularExpressions;
//线程用到命名空间
using System.Threading;
using System.Data.OleDb;


namespace 料单生成
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        ////关闭Form2时显示Form1
        //private void Form2_FormClosed(object sender, FormClosedEventArgs e)
        //{
        //    Form1.pForm1.Show();
        //}

        //全局变量 定义更改项原始内容
        string[] GlobalEditPart = new string[12];
        static bool EditFlag = false;

        //添加
        private void button4_Click(object sender, EventArgs e)
        {
            //查找添加的是否为重复的元件
            if ((PartName.Text != "") && (PartModel.Text != "") && (PartFoot.Text != "") && (PartNum.Text != "") && (PartNumS.Text != ""))
            {
                XElement xes = XElement.Load(strPath);//加载xml文件
                //查询指定名称的元素
                var elements = from element in xes.Elements("BomXML")
                               where (element.Element("PartModel").Value == PartModel.Text) && (element.Element("PartFoot").Value == PartFoot.Text)
                               select new
                               {
                                   序号 = element.Element("SerialNum").Value,       //统一编号
                                   索引 = element.Element("ComNum").Value,          //统一编号
                                   器件名称 = element.Element("PartName").Value,    //器件名称
                                   器件型号 = element.Element("PartModel").Value,   //器件型号
                                   器件封装 = element.Element("PartFoot").Value,    //器件封装
                                   器件数量 = element.Element("PartNum").Value,     //器件数量
                                   器件编号 = element.Element("PartNumS").Value,    //器件编号
                                   加工数量 = element.Element("OutNumS").Value,     //加工数量
                                   备注 = element.Element("Notes").Value,           //备注
                                   ID = element.Attribute("ID").Value,              //ID,
                               };

                if (elements.Count() > 0)
                {
                    MessageBox.Show("此器件型号，封装，已存在不要重复加！");
                }
                else
                {                    
                    //-------------------------------新增料单更改记录内容-------------------------------------
                    //生成更改记录
                    //if (File.Exists(Form1.GlobalBomRecName))
                    //{  //已存在，就添加记录
                        XElement xe = XElement.Load(Form1.GlobalBomRecName);
                        IEnumerable<XElement> elements1 = from element in xe.Elements("ChangeRecord")
                                                          select element;
                        //生成新的编号
                        string str = (Convert.ToInt32(elements1.Max(element => element.Attribute("ID").Value)) + 1).ToString("00000");

                        XElement people = new XElement(
                               "ChangeRecord", new XAttribute("ID", str),
                                new XElement("Content", "新增，器件名称：" + PartName.Text + " 器件型号" + PartModel.Text + "  器件封装：" + PartFoot.Text),                             //更改内容
                                new XElement("Description", "新增内容"),                   //更改备注说明
                                new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))     //日期
                            );
                        xe.Add(people);
                        xe.Save(Form1.GlobalBomRecName);
                    //}//不存在，新创建文件后再加一条记录
                    //else
                    //{
                    //    XDocument doc = new XDocument(
                    //            new XDeclaration("1.0", "utf-8", "yes"),
                    //            new XElement("ChangeRecordS",                                 //定单输出 数据库
                    //            new XElement("ChangeRecord",                                  //定单输出 一个定单
                    //            new XAttribute("ID", "00001"),                                 //ID                                   
                    //            new XElement("Content", "新增，器件名称：" + PartName.Text + " 器件型号" + PartModel.Text + "  器件封装：" + PartFoot.Text),                             //更改内容
                    //            new XElement("Description", "新增内容"),                   //更改备注说明
                    //            new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))     //日期
                    //            )
                    //            )
                    //        );

                    //doc.Save(Form1.GlobalBomRecName);
                    //}
                    //------------------------添加一条记录结束-----------------------------------------


                    //------------------------添加一条记录开始-----------------------------------------
                    XElement xe2 = XElement.Load(strPath);
                    IEnumerable<XElement> elements12 = from element in xe2.Elements("BomXML")
                                                      select element;
                    //生成新的编号
                    string str2 = (Convert.ToInt32(elements12.Max(element => element.Attribute("ID").Value)) + 1).ToString("00000");
                    XElement people1 = new XElement(
                           "BomXML", new XAttribute("ID", str2),
                        //new XAttribute("ID", "00001"),                       //ID自生成
                            new XElement("SerialNum", str2),                  //序号
                            new XElement("ComNum", "nc删除"),                     //统一编号
                            new XElement("PartName", PartName.Text),              //器件名称
                            new XElement("PartModel", PartModel.Text),            //器件型号
                            new XElement("PartFoot", PartFoot.Text),              //器件封装
                            new XElement("PartNum", PartNum.Text),                //器件数量
                            new XElement("PartNumS", PartNumS.Text),              //器件编号
                            new XElement("OutNumS", "nc删除"),                    //加工数量
                            new XElement("Notes", Notes.Text)                     //备注
                        );
                    xe2.Add(people1);
                    xe2.Save(strPath);
                    //------------------------添加一条记录结束-----------------------------------------

                    //重新加载
                    getXmlInfo();
                    MessageBox.Show("添加成功。");
                }              
            }
            else
            {
                MessageBox.Show("信息输入不完整，");
            }
        }

        string strPath="";
        //加载
        private void Form2_Load(object sender, EventArgs e)
        {
            strPath = Form1.GlobalBomName;
            if (File.Exists(strPath))
            {
                button1.Enabled = false; //
                getXmlInfo();
            }
        }
        //存ID
        string strID;

        #region 将XML文件内容绑定到DataGridView控件
        /// <summary>
        /// 将XML文件内容绑定到DataGridView控件
        /// </summary>
        private void getXmlInfo()
        {
            DataSet myds = new DataSet();
            myds.ReadXml(strPath);
            if (myds.Tables.Count > 0)
            {
                dataGridView1.DataSource = myds.Tables[0];
            }            
        }
        #endregion

        //双击行加载内容到文本框进行编辑
        private void dataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex >= 0 )
            {
                strID = dataGridView1.Rows[e.RowIndex].Cells[9].Value.ToString();

                XElement xe = XElement.Load(strPath);
                IEnumerable<XElement> elements = from PInfo in xe.Elements("BomXML")
                                                 where PInfo.Attribute("ID").Value == strID
                                                 select PInfo;
                foreach (XElement element in elements)
                {
                    //GlobalEditPart[6] = element.Element("SerialNum").Value;  //序号    
                    //ComNum.Text = element.Element("ComNum").Value;        //统一编号
                    PartName.Text = element.Element("PartName").Value;      //器件名称
                    PartModel.Text = element.Element("PartModel").Value;    //器件型号
                    PartFoot.Text = element.Element("PartFoot").Value;      //器件封装
                    PartNum.Text = element.Element("PartNum").Value;        //器件数量
                    PartNumS.Text = element.Element("PartNumS").Value;      //器件编号
                                                                            //加工数量
                    Notes.Text = element.Element("Notes").Value;            //备注
                    
                    EditFlag = true;
                    GlobalEditPart[0] = PartName.Text;    //器件名称
                    GlobalEditPart[1] = PartModel.Text;   //器件型号
                    GlobalEditPart[2] = PartFoot.Text;    //器件封装
                    GlobalEditPart[3] = PartNum.Text;     //器件数量
                    GlobalEditPart[4] = PartNumS.Text;    //器件编号
                    GlobalEditPart[5] = Notes.Text;       //备注说明
                    GlobalEditPart[6] = element.Element("SerialNum").Value;  //序号                    
                }                
            }          
        }

        //编辑
        private void button2_Click(object sender, EventArgs e)
        {
            if ( EditFlag == true)
            {
                string tempstr = "更改项为：1、", tempstrbeizhu = "更改原因：";

                if ((GlobalEditPart[0] != PartName.Text) || (GlobalEditPart[2] != PartFoot.Text) || (GlobalEditPart[3] != PartNum.Text) || (GlobalEditPart[4] != PartNumS.Text) || (GlobalEditPart[5] != Notes.Text))
                {
                    if (GlobalEditPart[0] != PartName.Text)
                    {
                        tempstr = tempstr + "器件名称：(" + GlobalEditPart[0] + ")->" + "(" + PartName.Text + ")";
                    }

                    if (GlobalEditPart[1] != PartModel.Text)
                    {
                        tempstr = tempstr + "器件型号：(" + GlobalEditPart[1] + ")->" + "(" + PartModel.Text + ")";
                    }

                    if (GlobalEditPart[2] != PartFoot.Text)
                    {
                        tempstr = tempstr + "器件封装：(" + GlobalEditPart[2] + ")->" + "(" + PartFoot.Text + ")";
                    }

                    if (GlobalEditPart[3] != PartNum.Text)
                    {
                        tempstr = tempstr + "器件数量：(" + GlobalEditPart[3] + ")->" + "(" + PartNum.Text + ")";

                    }

                    if (GlobalEditPart[4] != PartNumS.Text)
                    {
                        tempstr = tempstr + "器件编号：(" + GlobalEditPart[4] + ")->" + "(" + PartNumS.Text + ")";
                    }

                    if (GlobalEditPart[5] != Notes.Text)
                    {
                        tempstrbeizhu = tempstrbeizhu + Notes.Text;
                        //tempstr = tempstr + "备注说明：(" + GlobalEditPart[5] + ")->" + "(" + Notes.Text + ")";
                    }

                    if (MessageBox.Show(tempstr, "是否确定更改", MessageBoxButtons.OKCancel) == DialogResult.OK)
                    {
                        //-------------------------------新增料单更改记录内容-------------------------------------
                        //生成更改记录
                        if (File.Exists(Form1.GlobalBomRecName))
                        {  //已存在，就添加记录
                            XElement xe = XElement.Load(Form1.GlobalBomRecName);
                            IEnumerable<XElement> elements1 = from element in xe.Elements("ChangeRecord")
                                                              select element;
                            //生成新的编号
                            string str = (Convert.ToInt32(elements1.Max(element => element.Attribute("ID").Value)) + 1).ToString("00000");

                            XElement people = new XElement(
                                   "ChangeRecord", new XAttribute("ID", str),
                                    new XElement("Content", tempstr),                             //更改内容
                                    new XElement("Description", tempstrbeizhu),                   //更改备注说明
                                    new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))     //日期
                                );
                            xe.Add(people);
                            xe.Save(Form1.GlobalBomRecName);
                       }//不存在，新创建文件后再加一条记录
                        //else
                        //{
                        //    XDocument doc = new XDocument(
                        //            new XDeclaration("1.0", "utf-8", "yes"),
                        //            new XElement("ChangeRecordS",                                 //定单输出 数据库
                        //            new XElement("ChangeRecord",                                  //定单输出 一个定单
                        //            new XAttribute("ID", "00001"),                                 //ID                                   
                        //            new XElement("Content", tempstr),                             //更改内容
                        //            new XElement("Description", tempstrbeizhu),                   //更改备注说明
                        //            new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))     //日期
                        //            )
                        //            )
                        //        );

                        //    doc.Save(Form1.GlobalBomRecName);
                        //}

                        //-------------------------------新增料单更改记录内容结束-----------------------------------

                        //-------------------------------------------更新料单内容-----------------------------------
                        //更改料单内容
                        if (strID != "")
                        {
                            XElement xe = XElement.Load(strPath);
                            IEnumerable<XElement> elements = from element in xe.Elements("BomXML")
                                                             where element.Attribute("ID").Value == strID
                                                             select element;
                            if (elements.Count() > 0)
                            {
                                XElement newXE = elements.First();
                                newXE.SetAttributeValue("ID", strID);
                                newXE.ReplaceNodes(
                                            new XElement("SerialNum", GlobalEditPart[6]),           //序号
                                            new XElement("ComNum", "nc删除"),              //统一编号
                                            new XElement("PartName", PartName.Text),       //器件名称
                                            new XElement("PartModel", PartModel.Text),     //器件型号
                                            new XElement("PartFoot", PartFoot.Text),       //器件封装
                                            new XElement("PartNum", PartNum.Text),         //器件数量
                                            new XElement("PartNumS", PartNumS.Text),       //器件编号
                                            new XElement("OutNumS", "nc删除"),             //加工数量
                                            new XElement("Notes", Notes.Text)              //备注
                                    );
                            }
                            xe.Save(strPath);
                        }
                        getXmlInfo();
                        //-------------------------------------------更新料单内容结束-----------------------------------


                        EditFlag = false;       //更改完成清标志
                        strID = "";             //清ID内容
                        PartName.Text="";       //器件名称
                        PartModel.Text="";      //器件型号
                        PartFoot.Text="";       //器件封装
                        PartNum.Text="";        //器件数量
                        PartNumS.Text="";       //器件编号
                        Notes.Text = "";        //备注

                    }//写入记录结束
                }//判断是否已经更改为某一项内容
            }//判断是否有要更改的          
        }//编辑结束

        //删除
        private void button3_Click(object sender, EventArgs e)
        {
            //标志判断
            if (EditFlag == true)
            {
                //-------------------------------新增料单更改记录内容-------------------------------------
                //生成更改记录
                if (File.Exists(Form1.GlobalBomRecName))
                {  //已存在，就添加记录
                    XElement xe = XElement.Load(Form1.GlobalBomRecName);
                    IEnumerable<XElement> elements1 = from element in xe.Elements("ChangeRecord")
                                                      select element;
                    //生成新的编号
                    string str = (Convert.ToInt32(elements1.Max(element => element.Attribute("ID").Value)) + 1).ToString("00000");

                    XElement people = new XElement(
                           "ChangeRecord", new XAttribute("ID", str),
                            new XElement("Content", "删除，器件名称："+ PartName.Text + " 器件型号" + PartModel.Text + "  器件封装：" + PartFoot.Text),                             //更改内容
                            new XElement("Description", "删除内容"),                   //更改备注说明
                            new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))     //日期
                        );
                    xe.Add(people);
                    xe.Save(Form1.GlobalBomRecName);
                }//不存在，新创建文件后再加一条记录
                //else
                //{
                //    XDocument doc = new XDocument(
                //            new XDeclaration("1.0", "utf-8", "yes"),
                //            new XElement("ChangeRecordS",                                 //定单输出 数据库
                //            new XElement("ChangeRecord",                                  //定单输出 一个定单
                //            new XAttribute("ID", "00001"),                                 //ID                                   
                //            new XElement("Content", "删除，器件名称：" + PartName.Text + " 器件型号" + PartModel.Text + "  器件封装：" + PartFoot.Text),                             //更改内容
                //            new XElement("Description", "删除内容"),                   //更改备注说明
                //            new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))     //日期
                //            )
                //            )
                //        );

                //    doc.Save(Form1.GlobalBomRecName);
                //}

                //-------------------------------新增料单更改记录内容结束-----------------------------------

                //删除XML元素
                if (strID != "")
                {
                    XElement xe = XElement.Load(strPath);
                    IEnumerable<XElement> elements = from element in xe.Elements("BomXML")
                                                     where element.Attribute("ID").Value == strID
                                                     select element;
                    if (elements.Count() > 0)
                        elements.First().Remove();
                    xe.Save(strPath);
                }
                getXmlInfo();

                EditFlag = false;       //更改完成清标志
                strID = "";             //清ID内容
                PartName.Text = "";       //器件名称
                PartModel.Text = "";      //器件型号
                PartFoot.Text = "";       //器件封装
                PartNum.Text = "";        //器件数量
                PartNumS.Text = "";       //器件编号
                Notes.Text = "";        //备注
            }
        }
        
        //查找
        private void button5_Click(object sender, EventArgs e)
        {
            if (textBoxtype.Text != "")
            {
                XElement xes = XElement.Load(strPath);//加载xml文件
                //查询指定名称的元素
                var elements = from element in xes.Elements("BomXML")
                               where element.Element("PartModel").Value == textBoxtype.Text
                               select new
                               {
                                   序号 = element.Element("SerialNum").Value,       //统一编号
                                   索引 = element.Element("ComNum").Value,          //统一编号
                                   器件名称 = element.Element("PartName").Value,    //器件名称
                                   器件型号 = element.Element("PartModel").Value,   //器件型号
                                   器件封装 = element.Element("PartFoot").Value,    //器件封装
                                   器件数量 = element.Element("PartNum").Value,     //器件数量
                                   器件编号 = element.Element("PartNumS").Value,    //器件编号
                                   加工数量 = element.Element("OutNumS").Value,     //加工数量
                                   备注 = element.Element("Notes").Value,           //备注
                                   ID = element.Attribute("ID").Value,              //ID,
                               };

                if (elements.Count()>0)
                {
                    dataGridView1.DataSource = elements.ToList();   
                }                
            }
            else
            {
                    getXmlInfo();
            }
        }

        //创建
        private void button1_Click(object sender, EventArgs e)
        {
                        XDocument doc = new XDocument(
                new XDeclaration("1.0", "utf-8", "yes"),
                new XElement("ChangeRecordS",                                 //定单输出 数据库
                new XElement("ChangeRecord",                                  //定单输出 一个定单
                new XAttribute("ID", "00001"),                                 //ID                                   
                new XElement("Content", "创建文件，存入料单"),                //更改内容
                new XElement("Description", "创建文件，生成首个记录。"),      //更改备注说明
                new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))     //日期
                )
                )
            );
                        doc.Save(Form1.GlobalBomRecName);
        }

        //生成单个料单
        private void button6_Click(object sender, EventArgs e)
        {
            SaveFileDialog saveexcel = new SaveFileDialog();
            saveexcel.Filter = "Excel文件|*.xlsx";

            if (saveexcel.ShowDialog() == DialogResult.OK)
            {
                DataSet myds = new DataSet();
                myds.ReadXml(strPath);
                if (myds.Tables.Count > 0)
                {
                    dataGridView1.DataSource = myds.Tables[0];

                    File.Copy(@"C:\BOM\Excel2007样板单表.xlsx", @saveexcel.FileName, true);

                    Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();//实例化Excel对象
                    object missing = System.Reflection.Missing.Value;//获取缺少的object类型值
                    //打开指定的Excel文件
                    Microsoft.Office.Interop.Excel.Workbook OutWorkBook = excel.Application.Workbooks.Open(@saveexcel.FileName, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
                    OutWorkBook.Application.DisplayAlerts = false;
                    Excel.Worksheet SingleBomSheet;
                    //Excel.Range range;
                    //复制一个表
                    object Missing = System.Reflection.Missing.Value;                   //获取缺少的object类型值  
                    int sheetnum = 0;
                    for (int j = 1; j <= OutWorkBook.Worksheets.Count; j++)
                    {
                        if (OutWorkBook.Worksheets[j].Name == "料单样板")
                        {
                            sheetnum = j;
                        }
                    }

                    SingleBomSheet = OutWorkBook.Worksheets[sheetnum];
                    //写入到要输出的单表

                    for (int rows = 0; rows < dataGridView1.Rows.Count - 1; rows++)
                    {
                        SingleBomSheet.Cells[rows + 3, 1] = dataGridView1.Rows[rows].Cells[0].Value.ToString();//序号
                        //SingleBomSheet.Cells[rows + 3, 2] = dataGridView1.Rows[rows].Cells[1].Value.ToString();//统一编号
                        SingleBomSheet.Cells[rows + 3, 3] = dataGridView1.Rows[rows].Cells[2].Value.ToString();//器件名称
                        SingleBomSheet.Cells[rows + 3, 4] = dataGridView1.Rows[rows].Cells[3].Value.ToString();//器件型号
                        SingleBomSheet.Cells[rows + 3, 5] = dataGridView1.Rows[rows].Cells[4].Value.ToString();//器件封装
                        SingleBomSheet.Cells[rows + 3, 6] = dataGridView1.Rows[rows].Cells[5].Value.ToString();//器件数量
                        SingleBomSheet.Cells[rows + 3, 7] = dataGridView1.Rows[rows].Cells[6].Value.ToString();//器件编号
                        //SingleBomSheet.Cells[rows + 3, 8] = dataGridView1.Rows[rows].Cells[7].Value.ToString();//加工数量
                        if (dataGridView1.Rows[rows].Cells[8].Value.ToString() != "nc删除")
                        {
                            SingleBomSheet.Cells[rows + 3, 9] = dataGridView1.Rows[rows].Cells[8].Value.ToString();//备注
                        }
                        
                    }
                    string TempPath = Form1.GlobalBomName, Tempstr;
                    //BOM文件名
                    Tempstr = TempPath.Substring(TempPath.LastIndexOf("\\") + 1, TempPath.LastIndexOf(".") - (TempPath.LastIndexOf("\\") + 1)); //获取文件名
                    //获取文件扩展名
                    //TempPath.Substring(TempPath.LastIndexOf(".") + 1, TempPath.Length - TempPath.LastIndexOf(".") - 1)

                    //自定义页眉
                    SingleBomSheet.PageSetup.LeftHeader = @"&""微软雅黑,常规""文件编号: QR/JS-7.3-13";
                    //输出项目名称+BOM名+版本+中文名
                    SingleBomSheet.PageSetup.CenterHeader = @"&""微软雅黑,常规""&18" + Tempstr + "元件清单";
                    SingleBomSheet.PageSetup.RightHeader = @"&""微软雅黑,常规""版本: V10";// textBoxBomRev.Text;
                    //自定义页脚
                    SingleBomSheet.PageSetup.LeftFooter = @"&""微软雅黑,常规""日期:" + DateTime.Now.ToString("yyyy-MM-dd");
                    SingleBomSheet.PageSetup.CenterFooter = @"&""微软雅黑,常规""第&P页/共&N页";
                    SingleBomSheet.PageSetup.RightFooter = "";

                    OutWorkBook.Save();//保存工作表
                    OutWorkBook.Close(false, missing, missing);//关闭工作表

                    MessageBox.Show("导出完成。");
                }//判断是否有记录，有记录才能存入
            } //判断是否要存入对放框
        }

        private void button7_Click(object sender, EventArgs e)
        {
            this.Hide();
            Form1 form2 = new Form1();
            form2.Show();
        }//按建结束

    }// FORM结束
}//总程序结束
